package br.senai.sc.web.bacias.beans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ViewScoped;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.inject.Inject;
import javax.inject.Named;

import org.jboss.seam.international.status.Messages;
import org.jboss.seam.international.status.builder.BundleKey;

import br.senai.sc.controller.business.CidadeBusiness;
import br.senai.sc.controller.crud.BaciaHidrograficaCRUD;
import br.senai.sc.controller.crud.CidadeCRUD;
import br.senai.sc.controller.exception.BusinessException;
import br.senai.sc.model.BaciaHidrografica;
import br.senai.sc.model.Cidade;
import br.senai.sc.util.SystemConstants;

/**
 * @author Tiago
 */
@Named
@ViewScoped
public class BaciasBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private BaciaHidrografica bacia;

    @Inject
    private BaciaHidrograficaCRUD baciaHidrograficaCRUD;

    @Inject
    private CidadeCRUD cidadeCRUD;

    private List<Cidade> cidades;

    private DataModel<BaciaHidrografica> bacias;

    @Inject
    private Messages messages;

    @Inject
    private CidadeBusiness cidadeBusiness;

    public BaciaHidrografica getBacia() {
        return bacia;
    }

    public void setBacia(BaciaHidrografica bacia) {
        this.bacia = bacia;
    }

    public void setBacias(DataModel<BaciaHidrografica> bacias) {
        this.bacias = bacias;
    }

    public List<Cidade> getCidades() {

        if (cidades == null) {
            cidades = (ArrayList<Cidade>) cidadeCRUD.findCidades();
        }

        return cidades;
    }

    public void setCidades(List<Cidade> cidades) {
        this.cidades = cidades;
    }

    /**
     * Acionado quando o usuário deseja cadastrar uma nova bacia.
     */
    public void cadastrarBacia() {
        bacia = new BaciaHidrografica();
    }

    public DataModel<BaciaHidrografica> getBacias() {
        if (bacias == null) {
            bacias = new ListDataModel<BaciaHidrografica>(
                                                          baciaHidrograficaCRUD.findBaciasHidrograficas());
        }

        return bacias;
    }

    public void carregarBacia() {
    	
    	// TODO pesquisar uma solução melhor para o lazyinitializationexception
        bacia = baciaHidrograficaCRUD.findBaciaHidrografica(bacias.getRowData().getIdBaciaHidrografica());
        bacia.getCidades().size();
    }

    public boolean existeCidadeCadastrada() {
        return cidadeBusiness.existeCidadeCadastrada();
    }

    public void salvarBacia() {

        try {
            bacias = null;
            bacia = baciaHidrograficaCRUD.salvar(bacia);
            messages.info(new BundleKey(SystemConstants.PATH_TO_APPLICATION_MESSAGES, "bacias.cadastrar.sucesso"));
        } catch (BusinessException e) {}
    }

    public void removerBacia() {

    	try {
            baciaHidrograficaCRUD.remover(bacia);
            bacia = null;
            bacias = null;
            messages.info(new BundleKey(SystemConstants.PATH_TO_APPLICATION_MESSAGES, "bacias.remover.sucesso"));
        } catch (BusinessException e) {}
    }

}
